//
//  CCSkeletonCache.cpp
//  CCCSpine
//
//  Created by bin_you on 13-5-24.
//
//

#include "CCSkeletonCache.h"
#include "CCSpineLoader.h"

CCSkeletonCache* CCSkeletonCache::_pInstance=NULL;

CCSkeletonCache::CCSkeletonCache() {
    
}

CCSkeletonCache::~CCSkeletonCache() {
    purgeCache();
}

CCSkeletonCache* CCSkeletonCache::getInstance() {
    if (_pInstance==NULL) {
        _pInstance=new CCSkeletonCache();
    }
    return _pInstance;
}

void CCSkeletonCache::addSkeleton(CCSkeleton *skel) {
    SkeletonMap::iterator it=m_skeletonMap.find(skel->getName());
    if (it==m_skeletonMap.end()) {
        m_skeletonMap[skel->getName()]=skel;
        skel->retain();
    }
}

void CCSkeletonCache::addSkeleton(const char *name, CCSkeleton *skel) {
    skel->setName(name);
    addSkeleton(skel);
}

CCSkeleton* CCSkeletonCache::getSkeleton(const char* name) {
    SkeletonMap::iterator it=m_skeletonMap.find(name);
    if (it==m_skeletonMap.end()) {
        return NULL;
    }
    return it->second;
}

void CCSkeletonCache::removeSkeleton(const char *name) {
    SkeletonMap::iterator it=m_skeletonMap.find(name);
    if (it!=m_skeletonMap.end()) {
        it->second->release();
        m_skeletonMap.erase(it);
    }
    else {
        CCLOG("skeleton:%s is not find!",name);
    }
}

void CCSkeletonCache::purgeCache() {
    for (SkeletonMap::iterator it=m_skeletonMap.begin(); it!=m_skeletonMap.end(); it++) {
        it->second->release();
    }
    m_skeletonMap.clear();
}

CCSkeleton* CCSkeletonCache::loadSkeleton(const char* key,const char* jsonPath) {
    CCSkeleton* skeleton = CCSpineLoader::loadSkeleton(jsonPath);
    if(skeleton) {
        addSkeleton(key,skeleton);
    }
    return skeleton;
}